package com.blog.Utils;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisServerCommands;
import org.springframework.data.redis.connection.RedisStringCommands;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 任浩
 * @version 1.0
 */

@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class DataUtil {

    @Resource
    private RedisTemplate redisTemplate;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime dateTime;


//    public void setDateTime(LocalDateTime dateTime) {
//        log.info("设置的时间为：" + dateTime);
//        this.dateTime = dateTime;
//    }

    /**
     * 添加独立访问用户
     * @param ip
     */
    public void uvadd(String ip){
        //得到当天的存放独立用户的key
        log.info("设置");
        String uvkey = RedisKeyUtil.uvInit(dateTime);
        redisTemplate.opsForHyperLogLog().add(uvkey,ip);
        log.info("设置");
    }


    /**
     * 通过一个范围得到独立访问用户的范围。
     * @param start
     * @param end
     * @return
     */
    public Long getUvCount(LocalDateTime start,LocalDateTime end){
        List<String> list = new ArrayList();
        if(start.toString().equals(end.toString())){
            list.add(RedisKeyUtil.uvInit(start));  //把得到的范围key存放在list集合中。
        }

        while (!start.toString().equals(end.toString())){
            list.add(RedisKeyUtil.uvInit(start));  //把得到的范围key存放在list集合中。
            start = start.plusDays(1);
        }

        Long size = redisTemplate.opsForHyperLogLog().size(list.toArray());
        return size;
    }

    /**
     * 添加日访问用户
     * @param userid
     */
    public void addDau(Integer userid){
        //得到当天的日访问用户的key
        String daukey = RedisKeyUtil.dauInit(dateTime);
        redisTemplate.opsForValue().setBit(daukey,userid,true);
    }

    /**
     * 得到范围日访问用户的数量
     * @param start
     * @param end
     * @return
     */
    public Long getDauCount(LocalDateTime start,LocalDateTime end){
        List<byte[]> list = new ArrayList();
        if(start.toString().equals(end.toString())){
            list.add(RedisKeyUtil.dauInit(start).getBytes());  //把得到的范围key存放在list集合中。
        }
        while (!start.toString().equals(end.toString())){
            list.add(RedisKeyUtil.dauInit(start).getBytes());  //把得到的范围key存放在list集合中。
            start = start.plusDays(1);
        }

        String daukey = "daucount";
        Long count = (Long)redisTemplate.execute(new RedisCallback() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                //对bitmqp数据进行or操作。得到所有的日访问用户的总量.
                connection.bitOp(RedisStringCommands.BitOperation.OR, daukey.getBytes(), list.toArray(new byte[0][0]));
                return connection.bitCount(daukey.getBytes());
            }
        });
        return count;
    }
}
